/**
 * 版权所有 © 2024至今 长春嘉诚信息技术股份有限公司。保留所有权利。
 * 此源代码文件为闭源商业产品源代码，受《中华人民共和国著作权法》及和其它知识产权法和条约的保护。本产品只能在许可的范围内使用，不得以任何形式再次分发、转让或出售。
 * 有关许可条款的更多信息，请与长春嘉诚信息技术股份有限公司联系：http://www.jiachengnet.com.
 */

package com.jc.service.common.model;

import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.v3.oas.annotations.media.Schema;

import java.io.Serializable;
import java.util.List;

/**
 * 分页响应包装类.
 * @author libo
 * @version 1.0
 * @description: 分页响应包装类，用于统一分页返回格式
 * @date 2025-09-18 14:31
 */
@Schema(description = "分页响应")
public class PageResponse<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    @Schema(description = "分页信息")
    private PageInfo page;

    @Schema(description = "数据列表")
    private List<T> list;

    public PageResponse() {
    }

    public PageResponse(PageInfo page, List<T> list) {
        this.page = page;
        this.list = list;
    }

    /**
     * 从MyBatis Plus的IPage对象创建PageResponse
     * @param iPage MyBatis Plus分页对象
     * @param <T> 数据类型
     * @return PageResponse对象
     */
    public static <T> PageResponse<T> from(IPage<T> iPage) {
        PageInfo pageInfo = new PageInfo();
        pageInfo.setTotal(iPage.getTotal());
        pageInfo.setPageSize((int) iPage.getSize());
        pageInfo.setPageNum((int) iPage.getCurrent());
        
        return new PageResponse<>(pageInfo, iPage.getRecords());
    }

    public PageInfo getPage() {
        return page;
    }

    public void setPage(PageInfo page) {
        this.page = page;
    }

    public List<T> getList() {
        return list;
    }

    public void setList(List<T> list) {
        this.list = list;
    }

    /**
     * 分页信息内部类
     */
    @Schema(description = "分页信息")
    public static class PageInfo implements Serializable {

        private static final long serialVersionUID = 1L;

        @Schema(description = "总记录数")
        private long total;

        @Schema(description = "每页大小")
        private int pageSize;

        @Schema(description = "当前页码")
        private int pageNum;

        public PageInfo() {
        }

        public PageInfo(long total, int pageSize, int pageNum) {
            this.total = total;
            this.pageSize = pageSize;
            this.pageNum = pageNum;
        }

        public long getTotal() {
            return total;
        }

        public void setTotal(long total) {
            this.total = total;
        }

        public int getPageSize() {
            return pageSize;
        }

        public void setPageSize(int pageSize) {
            this.pageSize = pageSize;
        }

        public int getPageNum() {
            return pageNum;
        }

        public void setPageNum(int pageNum) {
            this.pageNum = pageNum;
        }
    }
}